﻿namespace LxBasic
{
    public struct SymMatrixR3C3
    {
        public SymMatrixR3C3(double a11, double a21, double a22, double a31, double a32, double a33)
        {
            this.a11 = a11;
            this.a21 = a21;
            this.a22 = a22;
            this.a31 = a31;
            this.a32 = a32;
            this.a33 = a33;
        }

        public double a11;
        //private double a12;
        //private double a13;
        public double a21;
        public double a22;
        //private double a23;
        public double a31;
        public double a32;
        public double a33;
        public static SymMatrixR3C3 operator *(double d, SymMatrixR3C3 m)
        {
            return new SymMatrixR3C3(
                d * m.a11,
                d * m.a21, d * m.a22,
                d * m.a31, d * m.a32, d * m.a33);
        }
        public static SymMatrixR3C3 operator -(SymMatrixR3C3 sym, DiagonalMatrixR3C3 dia)
        {
            return new SymMatrixR3C3(
                sym.a11 - dia.a11,
                sym.a21, sym.a22 - dia.a22,
                sym.a31, sym.a32, sym.a33 - dia.a33);
        }
        public double LengthSquared()
        {
            return a11 * a11 + a22 * a22 + a33 * a33
                + 2 * (a21 * a21 + a31 * a31 + a32 * a32);
        }
        public void Inverse()
        {
            double A_norm = a11 * a22 * a33 + a21 * a32 * a31 * 2 - a31 * a22 * a31 - a21 * a21 * a33 - a11 * a32 * a32;
            //1.暂时存储代数余子式的值
            double A11 = a22 * a33 - a32 * a32;
            double A21 = -(a21 * a33 - a31 * a32);
            double A22 = a11 * a33 - a31 * a31;
            double A31 = a32 * a21 - a22 * a31;
            double A32 = -(a11 * a32 - a31 * a21);
            double A33 = a11 * a22 - a21 * a21;
            //2.完全计算出A^-1
            a11 = A11 / A_norm;
            a21 = A21 / A_norm;
            a22 = A22 / A_norm;
            a31 = A31 / A_norm;
            a32 = A32 / A_norm;
            a33 = A33 / A_norm;
        }
        public MatrixR3C3 ToMatrixR3C3()
        {
            return new MatrixR3C3(a11, a21, a31, a21, a22, a32, a31, a32, a33);
        }
        public override string ToString()
        {
            return ToMatrixR3C3().ToString();
        }
    }
}
